package org.dromara.common.web.config;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.ShearCaptcha;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy;

import java.awt.*;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：验证码配置
 */
@AutoConfiguration
@EnableConfigurationProperties(CaptchaProperties.class)
public class CaptchaConfig {

    /**
     * 屏幕宽度常量定义
     */
    private static final int WIDTH = 160;

    /**
     * 屏幕高度常量定义
     */
    private static final int HEIGHT = 60;

    /**
     * 背景颜色常量定义，使用浅灰色作为默认背景色
     */
    private static final Color BACKGROUND = Color.LIGHT_GRAY;

    /**
     * 字体定义，使用Arial字体，粗体，字号为48
     */
    private static final Font FONT = new Font("Arial", Font.BOLD, 48);

    /**
     * 圆圈干扰验证码
     */
    @Lazy
    @Bean
    public CircleCaptcha circleCaptcha() {
        // 创建一个圆形验证码对象，并配置其属性
        // 创建指定宽度和高度的圆形验证码
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(WIDTH, HEIGHT);
        // 设置验证码的背景色
        captcha.setBackground(BACKGROUND);
        // 设置验证码的字体样式
        captcha.setFont(FONT);
        // 返回配置好的验证码对象
        return captcha;
    }

    /**
     * 线段干扰的验证码
     */
    // 使用@Lazy注解，确保该Bean在首次使用时才被初始化
    @Lazy
    @Bean
    public LineCaptcha lineCaptcha() {
        // 创建一个LineCaptcha实例，指定宽度和高度
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(WIDTH, HEIGHT);
        // 设置验证码的背景颜色
        captcha.setBackground(BACKGROUND);
        // 设置验证码的字体样式
        captcha.setFont(FONT);
        // 返回配置好的验证码实例
        return captcha;
    }

    /**
     * 扭曲干扰验证码
     */
    // 使用@Lazy注解，确保该Bean在首次访问时才被初始化
    @Lazy
    @Bean
    public ShearCaptcha shearCaptcha() {
        // 以下代码负责创建并配置一个滑块验证码对象
        // 使用工具类创建指定宽度和高度的滑块验证码
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(WIDTH, HEIGHT);
        // 设置验证码的背景颜色
        captcha.setBackground(BACKGROUND);
        // 设置验证码的字体样式
        captcha.setFont(FONT);
        return captcha;
    }

}
